/*
Sudoku Killer
自从2006年3月10日至11日的首届数独世界锦标赛以后，数独这项游戏越来越受到人们的喜爱和重视。
据说，在2008北京奥运会上，会将数独列为一个单独的项目进行比赛，冠军将有可能获得的一份巨大的奖品―――HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。
所以全球人民前仆后继，为了奖品日夜训练茶饭不思。当然也包括初学者linle，不过他太笨了又没有多少耐性，只能做做最最基本的数独题，不过他还是想得到那些奖品，你能帮帮他吗？你只要把答案告诉他就可以，不用教他是怎么做的。
数独游戏的规则是这样的：在一个9x9的方格中，你需要把数字1-9填写到空格当中，并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证，空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题，大家可以仔细观察一下，在这里面每行、每列，以及每个3x3的方格都包含1-9这九个数字。
Input
本题包含多组测试，每组之间由一个空行隔开。每组测试会给你一个 9*9 的矩阵，同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数，问号（?）表示需要你填的数。
Output
对于每组测试，请输出它的解，同一行相邻的两个数用一个空格分开。两组解之间要一个空行。
对于每组测试数据保证它有且只有一个解。
Sample Input
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3
Sample Output
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3
*/
#include <bits/stdc++.h>
#define ll long long
#define PI acos(-1)
#define M(n, m) memset(n, m, sizeof(n));
const int INF = 1e9 + 7;
const int maxn = 1e5;
using namespace std;

char c;
int Map[10][10];

// 判断同一行和同一列是否含有相同元素
bool row_column(int x,int y,int n)
{
    for(int i = 0; i < 9; i ++)
    {
        if(Map[x][i] == n && i != y)
            return false;
        if(Map[i][y] == n && i != x)
            return false;
    }
    return true;
}

//判断3*3的正方形是否满足
bool Judge(int x,int y,int n)
{
    for(int i = x / 3 * 3; i < x / 3 * 3 + 3; i ++)
        for(int j = y / 3 * 3; j < y / 3 * 3 + 3; j ++)
        {
            if(i == x && j == y)
                continue;
            if(Map[i][j] == n)
                return false;
        }
    return true;
}

bool DFS(int sum)
{
    if(sum >= 81)
        return true;

    int x = sum / 9;
    int y = sum % 9;
    if(!Map[x][y])
    {
        for(int i = 1; i <= 9; i ++)
        {
            Map[x][y] = i;
            if(row_column(x,y,i) && Judge(x,y,i))
                if(DFS(sum + 1))
                    return true;
            Map[x][y] = 0;
        }
    }
    else
        return DFS(sum + 1);
    return false;
}

int main()
{
    int s = 0;
    while (cin >> c)
    {
        // 控制每两个数据间一个空格
        if (!s)
            s = 1;
        else
            printf("\n");
        if (c == '?')
            Map[0][0] = 0;
        else
            Map[0][0] = c - '0';
        for (int i = 0; i < 9; i ++)
            for (int j = 0; j < 9; j ++)
            {
                if (i == 0 && j == 0)
                    continue;
                cin >> c;
                if (c == '?')
                    Map[i][j] = 0;
                else
                    Map[i][j] = c - '0';
            }
        DFS(0);
        for (int i = 0; i < 9; i ++)
        {
            for (int j = 0; j < 9; j ++)
                if (!j)
                    cout << Map[i][j];
                else
                    cout << " " << Map[i][j];
            cout << endl;
        }
    }
    return 0;
}